<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      回调函数 callback
        + 概念: 把 函数A 当做实参传递到 函数B 内
               在 函数B 内以形参的方式调用 函数A
               此时, 我们就说 函数A 是 函数B 的回调函数
        + 作用:
          1. 封装和遍历相关的内容
          2. 封装和异步相关的内容

      思考:
        + 封装: 为了把一个内容(行为) 放在一个函数内, 为了复用(灵活的复用)
        + 遍历: 使用循环从头到尾的获取到数组内的每一个数据
          => 我随着循环, 每次都做一样的事情, 但是可能有细节不一样
      例子:
        + 你作为我封装的一个对象
        + 功能: 跑腿
    */

    // function a(cb) {
    //   // 这里的 cb 形参接受的就是全局函数 b 的存储地址
    //   // 此时这里的形参 cb 和全局变量 b 操作的是一个函数地址
    //   // cb() // 等价于在调用 全局b 函数

    //   for (var i = 0; i < 10; i++) {
    //     cb()
    //   }
    // }

    // function b() {
    //   console.log('我是全局 b 函数')
    //   // 在这里做出你每次想做的事情就可以了
    // }


    // // 把 b 函数当做参数传递到 a 函数内了
    // // 变量 b 保存的是 一个函数的地址
    // // 这里当做实参传递进去的也就是一个函数的地址
    // a(b)





    // function sort(cb) {
    //   var arr = [ 10, 20, 30, 40, 50 ]
    //   for (var i = 0; i < arr.length - 1; i++) {
    //     // 此时的 cb 就是在调用 b 函数
    //     // cb() 函数调用阶段, 书写的叫做实参
    //     var res = cb(arr[i], arr[i + 1])
    //     if (res >= 0) {
    //       var tmp = arr[i]
    //       arr[i] = arr[i + 1]
    //       arr[i + 1] = tmp
    //     }
    //   }
    // }

    // // 这个 b 函数的调用, 就是写在 sort 函数内 cb(arr[i], arr[i + 1])
    // // 所以这里 return 出去的内容, 就应该再 cb 前面接受返回值
    // sort(function b(param1, param2) { return  param2 - param1 })


  </script>
</body>
</html>
